/*
 * @Descripttion: 
 * @version: 
 * @Author: 张敬坤
 * @Date: 2024-07-06 09:56:37
 * @LastEditors: Jikel
 * @LastEditTime: 2024-07-06 21:48:47
 */
import { createRouter, createWebHistory } from 'vue-router'

// 公共路由
export const constantRoutes = [
  {
    path: '',
    name: 'layout', // 必须要
    redirect: '/home',
    component: () => import('../layout/index.vue'),
    children: [
      {
        path: '/home',
        name: 'home',
        label: '首页',
        component: () => import('@/views/Home/index.vue'), // 首页
        meta: { // 路由元信息,存放数据 , 例如: 图标,标题,权限等
          title: '首页'
        }
      },
    ]
  },
  {
    path: '/login',
    name: 'login', // 必须要
    label: '登录页',
    hidden: true,
    component: () => import('@/views/Login/index.vue'), // 登录页面
  },
  {
    path: '/404',
    name: '404', // 必须要
    label: '404',
    hidden: true,
    component: () => import("@/views/error/404.vue"), // 登录页面
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes: constantRoutes,
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition;
    } else {
      return { top: 0 };
    }
  },
});

// 初始化保留的静态路由信息=> 静态路由的name集合
const whiteList = (constantRoutes) =>
  constantRoutes.reduce((names, route) => {
    names.push(route.name); // 添加当前路由的 name
    if (route.children) {
      names.push(...whiteList(route.children)); // 递归处理子路由
    }
    return names;
  }, []);


// 重置动态路由信息
// 注意! 这里有一个坑: router.getRoutes()筛选的是所有的路由 , 包括子级的路由 
// 所以在我们做路由重置时, 白名单中的name,必须是所有的路由的name, 如果没有子级的name,会把初始化的路由也删除!
export function resetRouter() {
  router.getRoutes().forEach((route) => {
    const { name } = route;   //获取路由name 
    if (name && !whiteList(constantRoutes).includes(name)) {     //路由不属于白名单,则删除 , 这是根据name进行筛选的,所以是必须要的
      router.hasRoute(name) && router.removeRoute(name);
    }

  });
}

export default router;
